package com.zed.api.common.param;

import java.util.List;
import java.util.Objects;

/**
 * 参数
 *
 * @author Zed
 */
public interface Parameters {

    static final String DOT = ".";

    /**
     * 根据<code>name</code>获取参数值
     *
     * @param name {@link String}, 参数名
     * @return {@link String}, 参数值，参数不存在则返回null.
     */
    Object getParameter(String name);

    /**
     * 根据<code>name</code>获取参数值,并转换响应的类型
     *
     * @param name         {@link String},名称
     * @param requireClazz {@link Class<T>},转换的类型
     * @return {@link T},可能为null
     */
    <T> T getParameter(String name, Class<T> requireClazz);

    /**
     * 根据<code>name</code>获取参数值,如果参数不存在，则返回<code>defaultValue</code>
     *
     * @param name         {@link String}, 参数名
     * @param defaultValue {@link String}, 参数不存在时返回的缺省值
     * @return {@link String}, 参数不存在是，返回<code>defautlValue</code>
     */
    default Object getParameter(String name, Object defaultValue) {
        Object result = this.getParameter(name);
        return result == null ? defaultValue : result;
    }

    /**
     * 获取所有初始化参数名称
     *
     * @return {@link List}, 列表
     */
    List<String> getParameterNames();

    /**
     * 获取所有满足<code>prefix</code>前缀的参数名<br>
     * 如果<code>name</code>不是以"."为结尾，执行时会自动添加"."后再进行比较。
     *
     * @param prefix {@link String}
     * @return {@link List}
     */
    List<String> getParameterNames(String prefix);

    /**
     * 获取所有<code>prefix</code>前缀的参数构成子初始化参数
     *
     * <pre>
     * </pre>
     *
     * @param prefix {@link String}, 前缀
     * @return {@link Parameters}
     */
    default Parameters subset(String prefix) {
        Objects.requireNonNull(prefix, "\"prefix\" cannot be null.");
        return new SubsetParameters(this, prefix);
    }

}
